/*******************************************************************************  
	Universidad del Valle de Guatemala
	Algoritmos y estructuras de datos
	Karen Tojin   08091
	Fecha: 15 de Julio de 2009
	Descrici�n: Programa que simula un parqueo, con el uso de pilas
	******************************************************************************/

/**
 * @param <Element>
 * @author karenAndy
 *
 */
public class ParquearStack<Element> implements InterfazParqueo {
	
		private Object[] autos;
		private int espacios, espacioEnUso;
		private final int max=10;
		
                /**
                 *
                 * @param espacios
                 */
                public ParquearStack(int espacios){
			autos = new Object[max];
			this.espacios = espacios;
			espacioEnUso = 0;
		}

                /**
                 *
                 * @param newElement
                 * @throws ParqueoLlenoException
                 */
                @Override
		public void Push(Object newElement) throws ParqueoLlenoException{
			if(this.Full())
				throw new ParqueoLlenoException("El parqueo est� lleno, espere a que salga alg�n autom�vil");
			else{
				autos[espacios] = newElement;
				System.out.println("Se ingres� "+autos[espacios]);
				espacios++;
			}
		}
		
                /**
                 *
                 * @return
                 * @throws ParqueoVacioException
                 */
                @Override
		public Object Pop() throws ParqueoVacioException{
			if(this.Empty())
				throw new ParqueoVacioException("El parqueo est� vac�o");
			
			else{
				espacios--;
			}
			return autos[espacios];
		}

                /**
                 *
                 * @return
                 */
                @Override
		public boolean Empty() {
			if(espacios==0)
				return true;
			return false;
		}
		
                /**
                 *
                 * @return
                 */
                public boolean Full(){
			if(espacios==max)
				return true;
			return false;
		}
		
		//Chequear para ver si lo que tiene que pedir es el objeto auto, se pide el "piso" en el q est� el autom�vil, no la pos exacta
                /**
                 *
                 * @return
                 * @throws ParqueoVacioException
                 */
                @Override
		public Object Peek() throws ParqueoVacioException{
			if(this.Empty())
				throw new ParqueoVacioException("El parqueo est� vac�o");
			else
				return autos[espacios-1];
		}
		
                /**
                 *
                 * @param elementSearch
                 * @return
                 * @throws NoEncontradoException
                 */
                public int BuscarAuto(Object elementSearch)throws NoEncontradoException{
			for(int i=0; i<=(espacios-1); i++){
				if((autos[i]).equals(elementSearch)){
					return i;
				}
			}
			return -1;
		}
		
                /**
                 *
                 * @return
                 */
                public int getEspaciosOcupados(){
			return espacios;
		}
		
    @Override
		public String toString(){
			String MostrarElementos="";
			for(int i=espacios-1; i>=0; i--){
				try{
					MostrarElementos +=("\t"+autos[i].toString()+"\n");
				} catch (Exception exception){
					System.out.println(exception);
				}
			}
			String cantElementos = MostrarElementos+ "\nTotal espacios " + espacios;
			return cantElementos;
		}	
}